iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 20
0
自我挑戰組

零基礎成為 AI 解夢大師秘笈系列 第 20

【零基礎成為 AI 解夢大師秘笈】Day20 - 周易解夢之人工智慧(I)

  • 分享至 

  • xImage
  •  

人工智慧1

前言

系列文章簡介

大家好,我們是 AI . FREE Team - 人工智慧自由團隊,這一次的鐵人賽,自由團隊將從0到1 手把手教各位讀者學會 (1)Python基礎語法 (2)Python Web 網頁開發框架 – Django (3)Python網頁爬蟲 – 周易解夢網 (4)Tensorflow AI語言模型基礎與訓練 – LSTM (5)實際部屬AI解夢模型到Web框架上。

為什麼技術要從零開始寫起

自由團隊的成立宗旨為開發AI/新科技的學習資源,提供各領域的學習者能夠跨域學習資料科學,並透過自主學習發展協槓職涯,結合智能應用到各式領域,無論是文、法、商、管、醫領域的朋友,都可以自由的學習AI技術。

資源

AI . FREE Team 讀者專屬福利 → Python Basics 免費學習資源

Yo~終於介紹到模型的部分了,但是再講模型之前,我們還是要先探討何謂人工智慧、資料科學等等...

相信2020年的大家對於人工智慧都已經相當了解,即使不是在這個領域的人,也在網路、新聞上看到許多這領域的事蹟,小到專題研討,大到國際廠牌嵌入AI模組,AI的影響力越來越大,那就讓我們來檢視,這個黑盒子裡面到底賣的是什麼藥!

在這邊文章,將帶一些實作讓大家更有感覺~

人工智慧的鼻祖

最早可以追朔到1943年,由Warren McCulloch and Walter Pitts 所推出的McCulloch–Pitts neuron network,以下簡稱 MP model

那為什麼會叫Neuron Network,因為神經網路其實就像人類的神經運作方式一樣

人們期許AI像人類的大腦一樣,具有神經間輸入與輸出的運作模式

好的,回來我們的MP model,來檢視一下MP model的數學式子

從下圖我們可以知道,這是一個binary的task,輸入為X,輸出為Y

當X>=θ則Y=1,反之X<θ則Y=-1

  • Xi為每個輸入的值

  • θ是一個threshold,作為判斷式的條件用

由上圖我們可以發現,MP model似乎只能處理boolean值,而f裡面為數學運算式,其實就是很簡單的輸入X的總和,g就是threshold的判斷,來決定輸出為0或1(True or False)

如果還不夠了解的話,我們可以直接進入實作,大家一定明白在做什麼

實作

這是一個邏輯運算問題,AND運算(&), OR運算(|), XOR運算(^)

我們先從AND(&)開始,以下真值表

我們可以看到AND的輸入需兩個都為1輸出才是1

如果使用前面幾天python basic的教學,使用幾個if判斷式就做出來了

一定超簡單!!

但是我們要揣摩神經網路,讓神經位元去判斷最佳的參數

一開始先宣告我們的資料集,使用numpy這個高階矩陣運算工具~

import numpy as np
X_tr = np.array([[0,0],[0,1],[1,0],[1,1]])
print(X_tr)

可以看到我們的輸出為一個二維陣列

[[0 0]
 [0 1]
 [1 0]
 [1 1]]

宣告輸出

y_and = np.array([0,0,0,1])
print(y_and)

輸出為一維陣列

[0 0 0 1]

宣告完資料集,接下來定義我們的數學模型(MP model)

class MP_Neuron_network:
  def __init__(self):
    self.b = None
  
  def math_f(self,x):
    return(sum(x) >= self.b) #回傳是否大於b

  def predict(self ,X):
    Y = []
    for x in X:
      result = self.math_f(x) 
      Y.append(result) 
    return np.array(Y)

  def acc_score(self,y_p,y_t):
    c = 0
    for i,j in zip(y_p,y_t):
      if i == j:
        c += 1
    return (c / len(y_t))*100  # or y_p

  def fit(self , X,Y):
    accuracy = {}

    for b in range(5):
      self.b = b
      Y_pred = self.predict(X)
      # print(Y_pred)
      accuracy[b] = self.acc_score(Y_pred,Y)
      print('b為 ({}) 預測為{} ,其正確率為{}'.format(b , Y_pred ,accuracy[b]))
      best_b = max(accuracy ,key = accuracy.get)
      print('b為 {} 是目前最好的結果,其正確率為 {}'.format(best_b,accuracy[best_b]))
      print("")
      self.b = best_b

    print('最好的b為',best_b)
    print('最高的正確率',accuracy[best_b])

可能有點長,且聽我娓娓道來

  • __init__ : 為初始宣告變數b
  • math_f : 將第Xi個的兩個值做單純的相加,並且判斷是否大於b
  • predict : 用for迴圈,透過math_f將每個回傳的值放進Y陣列裡
  • acc_score : 進行預測的值與答案進行比對,算出正確率
  • fit : 這個funciton比較長,我在程式內進行了註解,還有一些螢幕輸出讓大家更好理解,簡單來說就是呼叫以上的funciton,不過最重要的功能,是要保留最高的acc_score的參數b

接下來就餵資料進去吧~

mp_model = MP_Neuron_network()
mp_model.fit(X_tr,y_and)

輸出為

b為 (0) 預測為[ True  True  True  True] ,其正確率為25.0
b為 0 是目前最好的結果,其正確率為 25.0

b為 (1) 預測為[False  True  True  True] ,其正確率為50.0
b為 1 是目前最好的結果,其正確率為 50.0

b為 (2) 預測為[False False False  True] ,其正確率為100.0
b為 2 是目前最好的結果,其正確率為 100.0

b為 (3) 預測為[False False False False] ,其正確率為75.0
b為 2 是目前最好的結果,其正確率為 100.0

b為 (4) 預測為[False False False False] ,其正確率為75.0
b為 2 是目前最好的結果,其正確率為 100.0

最好的b為 2
最高的正確率 100.0

其實不難理解,因為AND是兩個都為1輸出才是1,所以當Xi內的值兩個相加 >= 2時,他就會找到最佳參數b

使用測試資料,並進行預測

X_test = np.array([[0,1],[1,1],[0,0],[1,0]])
mp_model.predict(X_test)

輸出

array([False,  True, False, False])

接下來進行 or(|)

改變輸出的答案就好

X_tr = np.array([[0,0],[0,1],[1,0],[1,1]])
y_or = np.array([0,1,1,1])
print(y_or)

輸出

[0 1 1 1]

直接丟進我們的MP model

mp_model = MP_Neuron_network()
mp_model.fit(X_tr,y_or)

輸出

b為 (0) 預測為[ True  True  True  True] ,其正確率為75.0
b為 0 是目前最好的結果,其正確率為 75.0

b為 (1) 預測為[False  True  True  True] ,其正確率為100.0
b為 1 是目前最好的結果,其正確率為 100.0

b為 (2) 預測為[False False False  True] ,其正確率為50.0
b為 1 是目前最好的結果,其正確率為 100.0

b為 (3) 預測為[False False False False] ,其正確率為25.0
b為 1 是目前最好的結果,其正確率為 100.0

b為 (4) 預測為[False False False False] ,其正確率為25.0
b為 1 是目前最好的結果,其正確率為 100.0

最好的b為 1
最高的正確率 100.0

測試資料

X_test = np.array([[0,1],[1,1],[0,0],[1,0]])
mp_model.predict(X_test)

輸出

array([ True,  True, False,  True])

試試看 XOR(^)吧

一樣改變我們的答案

import numpy as np
X_tr = np.array([[0,0],[0,1],[1,0],[1,1]])
y_xor = np.array([0,1,1,0])
print(y_xor)

輸出

[0 1 1 0]

將資料丟進模型

mp_model = MP_Neuron_network()
mp_model.fit(X_tr,y_xor)

輸出

b為 (0) 預測為[ True  True  True  True] ,其正確率為50.0
b為 0 是目前最好的結果,其正確率為 50.0

b為 (1) 預測為[False  True  True  True] ,其正確率為75.0
b為 1 是目前最好的結果,其正確率為 75.0

b為 (2) 預測為[False False False  True] ,其正確率為25.0
b為 1 是目前最好的結果,其正確率為 75.0

b為 (3) 預測為[False False False False] ,其正確率為50.0
b為 1 是目前最好的結果,其正確率為 75.0

b為 (4) 預測為[False False False False] ,其正確率為50.0
b為 1 是目前最好的結果,其正確率為 75.0

最好的b為 1
最高的正確率 75.0

想更深入認識 AI . FREE Team ?

自由團隊 官方網站:https://aifreeblog.herokuapp.com/
自由團隊 Github:https://github.com/AI-FREE-Team/
自由團隊 粉絲專頁:https://www.facebook.com/AI.Free.Team/
自由團隊 IG:https://www.instagram.com/aifreeteam/
自由團隊 Youtube:https://www.youtube.com/channel/UCjw6Kuw3kwM_il39NTBJVTg/

文章同步發布於:自由團隊部落格
(想看更多文章?學習更多AI知識?敬請鎖定自由團隊的頻道!)


上一篇
【零基礎成為 AI 解夢大師秘笈】Day19 - 周易解夢之網路爬蟲進階篇
下一篇
【零基礎成為 AI 解夢大師秘笈】Day21 - 周易解夢之人工智慧(2)
系列文
零基礎成為 AI 解夢大師秘笈30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言